package jp.co.nes.awssupport.business.bean;

import java.math.BigDecimal;
import java.time.ZonedDateTime;

import jp.co.nes.awssupport.business.annotation.BillingCsvField;
import jp.co.nes.awssupport.business.constant.LineItemType;
import jp.co.nes.awssupport.business.constant.Term;
import jp.co.nes.awssupport.common.bean.BaseBean;

/**
 * 請求CSVです。
 */
public class BillingCsvBean extends BaseBean {

    /** serialVersionUID */
    private static final long serialVersionUID = 1L;

    /** 請求書ID */
    @BillingCsvField(category = "bill")
    private String invoiceId;

    /** AWS販売者 */
    @BillingCsvField(category = "bill")
    private String billingEntity;

    /** 一括請求アカウントID */
    @BillingCsvField(category = "bill")
    private String payerAccountId;

    /** 連結アカウントID */
    @BillingCsvField(category = "lineItem", name = "UsageAccountId")
    private String linkedAccountId;

    /** 請求の種類 */
    @BillingCsvField(category = "lineItem")
    private LineItemType lineItemType;

    /** 製品名 */
    @BillingCsvField(category = "product")
    private String productName;

    /** 使用タイプ */
    @BillingCsvField(category = "lineItem")
    private String usageType;

    /** 操作 */
    @BillingCsvField(category = "lineItem")
    private String operation;

    /** 使用開始日時 */
    @BillingCsvField(category = "lineItem")
    private ZonedDateTime usageStartDate;

    /** 使用終了日時 */
    @BillingCsvField(category = "lineItem")
    private ZonedDateTime usageEndDate;

    /** 使用量 */
    @BillingCsvField(category = "lineItem", name = "UsageAmount")
    private BigDecimal usageQuantity;

    /** 非混合レート */
    @BillingCsvField(category = "lineItem")
    private BigDecimal unblendedRate;

    /** 非混合料金 */
    @BillingCsvField(category = "lineItem")
    private BigDecimal unblendedCost;

    /** lineItemDescription */
    @BillingCsvField(category = "lineItem")
    private String lineItemDescription;

    /** パブリックオンデマンドレート */
    // マニュフェストに設定されているcolumnの内容が先頭小文字のため、
    // 省略してフィールド名を使用すると、先頭が大文字になり、合致しない。
    // よって、name属性で先頭小文字で設定する。
    @BillingCsvField(category = "pricing", name = "publicOnDemandRate")
    private BigDecimal publicOnDemandRate;

    /** パブリックオンデマンドコスト */
    // マニュフェストに設定されているcolumnの内容が先頭小文字のため、
    // 省略してフィールド名を使用すると、先頭が大文字になり、合致しない。
    // よって、name属性で先頭小文字で設定する。
    @BillingCsvField(category = "pricing", name = "publicOnDemandCost")
    private BigDecimal publicOnDemandCost;

    /** AWS使用の種類(リザーブドやオンデマンド) */
    // マニュフェストに設定されているcolumnの内容が先頭小文字のため、
    // 省略してフィールド名を使用すると、先頭が大文字になり、合致しない。
    // よって、name属性で先頭小文字で設定する。
    @BillingCsvField(category = "pricing", name = "term")
    private Term term;

    /** 単位 */
    // マニュフェストに設定されているcolumnの内容が先頭小文字のため、
    // 省略してフィールド名を使用すると、先頭が大文字になり、合致しない。
    // よって、name属性で先頭小文字で設定する。
    @BillingCsvField(category = "pricing", name = "unit")
    private String unit;

    /** リソースID */
    @BillingCsvField(category = "lineItem")
    private String resourceId;

    /** リザーブドインスタンスARN */
    // マニュフェストに出力されない場合がある(よってrequired属性をfalseにしている)。
    // -> Payerの中で、1件もリザーブドインスタンスが購入されていない場合、請求CSVではリザーブドインスタンスARNが、
    //    出力されず、マニュフェストでもcolumnの情報が出力されない。
    @BillingCsvField(category = "reservation", required = false)
    private String reservationARN;

    /** Nameタグ */
    @BillingCsvField(category = "resourceTags", name = "user:Name")
    private String nameTag;

    /** レート */
    private BigDecimal rate;

    /** description(日本語説明用) */
    private String description;

    /**
     * デフォルトコンストラクタです。
     */
    public BillingCsvBean() {
    }

    /**
     * 請求書IDを返却します。
     *
     * @return 請求書ID
     */
    public String getInvoiceId() {
        return invoiceId;
    }

    /**
     * 請求書IDを設定します。
     *
     * @param invoiceId セットする invoiceId
     */
    public void setInvoiceId(String invoiceId) {
        this.invoiceId = invoiceId;
    }

    /**
     * AWS販売者を返却します。
     *
     * @return AWS販売者
     */
    public String getBillingEntity() {
        return billingEntity;
    }

    /**
     * AWS販売者を設定します。
     *
     * @param billingEntity AWS販売者
     */
    public void setBillingEntity(String billingEntity) {
        this.billingEntity = billingEntity;
    }

    /**
     * 一括請求アカウントIDを返却します。
     *
     * @return 一括請求アカウントID
     */
    public String getPayerAccountId() {
        return payerAccountId;
    }

    /**
     * 一括請求アカウントIDを設定します。
     *
     * @param payerAccountId 一括請求アカウントID
     */
    public void setPayerAccountId(String payerAccountId) {
        this.payerAccountId = payerAccountId;
    }

    /**
     * 連結アカウントIDを返却します。
     *
     * @return 連結アカウントID
     */
    public String getLinkedAccountId() {
        return linkedAccountId;
    }

    /**
     * 連結アカウントIDを設定します。
     *
     * @param linkedAccountId 連結アカウントID
     */
    public void setLinkedAccountId(String linkedAccountId) {
        this.linkedAccountId = linkedAccountId;
    }

    /**
     * 請求の種類を返却します。
     *
     * @return 請求の種類
     */
    public LineItemType getLineItemType() {
        return lineItemType;
    }

    /**
     * 請求の種類を設定します。
     *
     * @param lineItemType 請求の種類
     */
    public void setLineItemType(LineItemType lineItemType) {
        this.lineItemType = lineItemType;
    }

    /**
     * 製品名を返却します。
     *
     * @return 製品名
     */
    public String getProductName() {
        return productName;
    }

    /**
     * 製品名を設定します。
     *
     * @param productName 製品名
     */
    public void setProductName(String productName) {
        this.productName = productName;
    }

    /**
     * 使用タイプを返却します。
     *
     * @return u使用タイプ
     */
    public String getUsageType() {
        return usageType;
    }

    /**
     * 使用タイプを設定します。
     *
     * @param usageType 使用タイプ
     */
    public void setUsageType(String usageType) {
        this.usageType = usageType;
    }

    /**
     * 操作を返却します。
     *
     * @return 操作
     */
    public String getOperation() {
        return operation;
    }

    /**
     * 操作を設定します。
     *
     * @param operation 操作
     */
    public void setOperation(String operation) {
        this.operation = operation;
    }

    /**
     * 使用開始日時を返却します。
     *
     * @return 使用開始日時
     */
    public ZonedDateTime getUsageStartDate() {
        return usageStartDate;
    }

    /**
     * 使用開始日時を設定します。
     *
     * @param usageStartDate 使用開始日時
     */
    public void setUsageStartDate(ZonedDateTime usageStartDate) {
        this.usageStartDate = usageStartDate;
    }

    /**
     * 使用終了日時を返却します。
     *
     * @return 使用終了日時
     */
    public ZonedDateTime getUsageEndDate() {
        return usageEndDate;
    }

    /**
     * 使用終了日時を設定します。
     *
     * @param usageEndDate 使用終了日時
     */
    public void setUsageEndDate(ZonedDateTime usageEndDate) {
        this.usageEndDate = usageEndDate;
    }

    /**
     * 使用量を返却します。
     *
     * @return 使用量
     */
    public BigDecimal getUsageQuantity() {
        return usageQuantity;
    }

    /**
     * 使用量を設定します。
     *
     * @param usageQuantity 使用量
     */
    public void setUsageQuantity(BigDecimal usageQuantity) {
        this.usageQuantity = usageQuantity;
    }

    /**
     * 非混合レートを返却します。
     *
     * @return 非混合レート
     */
    public BigDecimal getUnblendedRate() {
        return unblendedRate;
    }

    /**
     * 非混合レートを設定します。
     *
     * @param unblendedRate 非混合レート
     */
    public void setUnblendedRate(BigDecimal unblendedRate) {
        this.unblendedRate = unblendedRate;
    }

    /**
     * 非混合料金を返却します。
     *
     * @return 非混合料金
     */
    public BigDecimal getUnblendedCost() {
        return unblendedCost;
    }

    /**
     * lineItemDescriptionを返却します。
     *
     * @return lineItemDescription
     */
    public String getLineItemDescription() {
        return lineItemDescription;
    }

    /**
     * lineItemDescriptionを設定します。
     *
     * @param lineItemDescription lineItemDescription
     */
    public void setLineItemDescription(String lineItemDescription) {
        this.lineItemDescription = lineItemDescription;
    }

    /**
     * 非混合料金を設定します。
     *
     * @param unblendedCost 非混合料金
     */
    public void setUnblendedCost(BigDecimal unblendedCost) {
        this.unblendedCost = unblendedCost;
    }

    /**
     * パブリックオンデマンドレートを返却します。
     *
     * @return パブリックオンデマンドレート
     */
    public BigDecimal getPublicOnDemandRate() {
        return publicOnDemandRate;
    }

    /**
     * パブリックオンデマンドレートを設定します。
     *
     * @param publicOnDemandRate パブリックオンデマンドレート
     */
    public void setPublicOnDemandRate(BigDecimal publicOnDemandRate) {
        this.publicOnDemandRate = publicOnDemandRate;
    }

    /**
     * パブリックオンデマンドコストを返却します。
     *
     * @return パブリックオンデマンドコスト
     */
    public BigDecimal getPublicOnDemandCost() {
        return publicOnDemandCost;
    }

    /**
     * パブリックオンデマンドコストを設定します。
     *
     * @param publicOnDemandRate パブリックオンデマンドコスト
     */
    public void setPublicOnDemandCost(BigDecimal publicOnDemandCost) {
        this.publicOnDemandCost = publicOnDemandCost;
    }

    /**
     * AWS使用の種類(リザーブドやオンデマンド)を返却します。
     *
     * @return AWS使用の種類(リザーブドやオンデマンド)
     */
    public Term getTerm() {
        return term;
    }

    /**
     * AWS使用の種類(リザーブドやオンデマンド)を設定します。
     *
     * @param term AWS使用の種類(リザーブドやオンデマンド)
     */
    public void setTerm(Term term) {
        this.term = term;
    }

    /**
     * 単位を返却します。
     *
     * @return 単位
     */
    public String getUnit() {
        return unit;
    }

    /**
     * 単位を設定します。
     *
     * @param unit 単位
     */
    public void setUnit(String unit) {
        this.unit = unit;
    }

    /**
     * リソースIDを返却します。
     *
     * @return リソースID
     */
    public String getResourceId() {
        return resourceId;
    }

    /**
     * リソースIDを設定します。
     *
     * @param resourceId リソースID
     */
    public void setResourceId(String resourceId) {
        this.resourceId = resourceId;
    }

    /**
     * リザーブドインスタンスARNを返却します。
     *
     * @return リザーブドインスタンスARN
     */
    public String getReservationARN() {
        return reservationARN;
    }

    /**
     * リザーブドインスタンスARNを設定します。
     *
     * @param reservationARN リザーブドインスタンスARN
     */
    public void setReservationARN(String reservationARN) {
        this.reservationARN = reservationARN;
    }

    /**
     * Nameタグを返却します。
     *
     * @return Nameタグ
     */
    public String getNameTag() {
        return nameTag;
    }

    /**
     * Nameタグを設定します。
     *
     * @param nameTag Nameタグ
     */
    public void setNameTag(String nameTag) {
        this.nameTag = nameTag;
    }

    /**
     * レートを返却します。
     *
     * @return レート
     */
    public BigDecimal getRate() {
        return rate;
    }

    /**
     * レートを設定します。
     *
     * @param rate レート
     */
    public void setRate(BigDecimal rate) {
        this.rate = rate;
    }

    /**
     * description(日本語説明用)を返却します。
     *
     * @return description(日本語説明用)
     */
    public String getDescription() {
        return description;
    }

    /**
     * description(日本語説明用)を設定します。
     *
     * @param description description(日本語説明用)
     */
    public void setDescription(String description) {
        this.description = description;
    }
}
